package jmine.tec.persist.dbchangelog.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import jmine.tec.persist.annotation.Alias;

import org.hibernate.annotations.Type;

import bancosys.tec.component.Documentation;
import bancosys.tec.persist.bussobj.PersistableBusinessObject;
import bancosys.tec.utils.date.Timestamp;

/**
 * Entidade responsável por armazenar as alterações da base de dados do sistema.
 */
@Entity
@Table(name = "DATABASE_CHANGE_RECORD")
@Alias("DBCHRD")
@SequenceGenerator(name = "SEQ_DBCHRD", sequenceName = "SEQ_DBCHRD")
@Documentation("REGISTROS DE ALTERAÇÕES FEITAS NO BANCO DE DADOS.")
public class DatabaseChangeLog extends PersistableBusinessObject {

    private static final short MAX_LENGTH = 255;

    private Long id;

    private Timestamp timestamp;

    private String description;

    /**
     * @return código do registro de alteração de base de dados.
     */
    @Id
    @Column(name = "COD_DB_CHANGE_RECORD")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_DBCHRD")
    @Documentation("CÓDIGO SEQUENCIAL DO REGISTRO DE ALTERAÇÃO.")
    public Long getId() {
        return id;
    }

    /**
     * @param id código do registro de alteração de base de dados.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return Data e hora da alteração de base de dados.
     */
    @Column(name = "CHANGE_TIMESTAMP", nullable = false)
    @Documentation("DATA/HORA DA ALTERAÇÃO DO BANCO DE DADOS.")
    @Type(type = "bancosys.tec.persist.hibernate.type.TimestampType")
    public Timestamp getTimestamp() {
        return timestamp;
    }

    /**
     * @param timestamp Data e hora da alteração de base de dados.
     */
    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }

    /**
     * @return Descrição da alteração.
     */
    @Column(name = "CHANGE_DESCRIPTION", length = MAX_LENGTH, nullable = false)
    @Documentation("DESCRIÇÃO DA ALTERAÇÃO NO BANCO DE DADOS.")
    public String getDescription() {
        return description;
    }

    /**
     * @param description Descrição da alteração.
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return "ID: " + this.getId() + " TIMESTAMP: " + this.getTimestamp() + " DESCRIPTION: " + this.getDescription();
    }
}
